package leetcode;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict，判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
 * 说明：
 * <p>
 * 拆分时可以重复使用字典中的单词。
 * 你可以假设字典中没有重复的单词。
 * 示例 1：
 * <p>
 * 输入: s = "leetcode", wordDict = ["leet", "code"]
 * 输出: true
 * 解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。
 * 示例 2：
 * <p>
 * 输入: s = "applepenapple", wordDict = ["apple", "pen"]
 * 输出: true
 * 解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
 * 注意你可以重复使用字典中的单词。
 * 示例 3：
 * <p>
 * 输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
 * 输出: false
 */

public class problems_139 {

    public static void main(String[] arge) {
        String s = "cars";
        List wordDict = new ArrayList() {{
            add("car");
            add("rs");
            add("ca");
        }};
        System.out.println(new Solution().wordBreak(s, wordDict));
    }

    /**
     *
     */
    static class Solution {
        Set<Integer> setFalse = new HashSet<>();
        public boolean wordBreak(String s, List<String> wordDict) {
            return findWord(s, wordDict, 0);
        }
        public boolean findWord(String s, List<String> wordDict, int index) {
            // 搜索到了最后，说明成功
            if (s.length() <= index) return true;
            if(setFalse.contains(index)) return false;
            // 遍历
            for (String word : wordDict) {
                // 判断字典是否匹配字段
                boolean same = true;
                for (int i = 0; i < word.length(); i++) {
                    if (index + i >= s.length() || s.charAt(index + i) != word.charAt(i)) {
                        same = false;
                        break;
                    }
                }
                // 匹配时，继续遍历
                if (same && findWord(s, wordDict, index + word.length())) {
                    return true;
                }
            }
            setFalse.add(index);
            return false;
        }
    }
}
